package com.example.atools;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.R.bool;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.StrictMode;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.text.format.DateFormat;
import android.util.DisplayMetrics;
import android.util.Log;

@SuppressLint("NewApi")
public class MyScheRcv extends BroadcastReceiver {

	private static String mPrefName="MyScheRcv";
	
	@SuppressLint("NewApi")
	@Override
	public void onReceive(Context arg0, Intent arg1) {
		// TODO Auto-generated method stub
		
		try {
			if (android.os.Build.VERSION.SDK_INT > 9) {
				StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
				StrictMode.setThreadPolicy(policy);
			}
		}
		catch (Exception e){}
		
		//showTest(arg0);
		//Kiểm tra thời gian hiện tại nằm ngoài khoảng ngừng request
		loadConfigFromPref(arg0);
		if (checkTimeInExclude())
		{
			return;
		}
		
		//if (checkReadyRun()) //Bỏ phần check trên SD Card đi
			showMsg(arg0);
		
	}

	//Kiểm tra thời gian hiện tại có thuộc các khung giờ ngừng request hay không
	public static boolean checkTimeInExclude() {
		try {
			if (Tools.isStrNullOrEmpty(MyConstant.mFreqExclude) || MyConstant.mFreqExclude.equals("null"))
				return false;
			String arr[]=MyConstant.mFreqExclude.split(","), arrT[], arrH[];
			if (arr.length==1) { //Thử với một số ký tự ngăn cách khác
				arr=MyConstant.mFreqExclude.split(";");
				if (arr.length==1)
					arr=MyConstant.mFreqExclude.split("\\|");
			}
			
			Calendar dNow= Calendar.getInstance(), dStart= Calendar.getInstance(), dEnd= Calendar.getInstance();
			
			for(int i=0;i<arr.length;i++)
			{
				if (Tools.isStrNullOrEmpty(arr[i])) //|| arr[i].length() != 11
					continue;
				arrT=arr[i].split("-");
				if (arrT.length < 2)
					continue;
				//Khoảng bắt đầu
				arrH=arrT[0].split(":");
				dStart.set(Calendar.HOUR_OF_DAY, Tools.convertInt(arrH[0],23));
				dStart.set(Calendar.MINUTE, Tools.convertInt(arrH[1],0));
				dStart.set(Calendar.SECOND, 0);

				//Khoảng kết thúc
				arrH=arrT[1].split(":");
				dEnd.set(Calendar.HOUR_OF_DAY, Tools.convertInt(arrH[0],24));
				dEnd.set(Calendar.MINUTE, Tools.convertInt(arrH[1],0));
				dEnd.set(Calendar.SECOND, 0);
				if (dNow.getTimeInMillis() >= dStart.getTimeInMillis() && dNow.getTimeInMillis() <= dEnd.getTimeInMillis())
					return true;
			}
		}
		catch (Exception e)
		{
			
		}
		return false;
		
	}
	
	public static void showMsg(Context ctx) {
		//if (checkFirstRun(ctx)) //Bỏ qua chu kỳ đầu: mục đích khi vừa vào game thì không xử lý ngay
		//	return;
		if (!Tools.isNetworkAvailable(ctx))
			return;		
		//saveRunToFile(); //Không cần, chỉ để test
		String s=Tools.downloadUrlToString(MyConstant.pullurlmsg+"?did=" + Tools.getDeviceId(ctx) + "&appid=" + MyConstant.mAppId);
		if (Tools.isStrNullOrEmpty(s))
			return;
		String[] arr=s.split("</br>");
		int iCount=1;

		for(int i=0;i<arr.length;i++)
		{
			if (Tools.stringIsNullOrEmpty(arr[i]))
				continue;
			if (arr[i].startsWith("@")) //xử lý lệnh điều khiển
			{
				String[] arrT=arr[i].split(":");
				if (arrT.length < 2)
					continue;
				if (arrT[0].equals("@freq"))
				{
					//Set lại alarm: không dùng, test không có tác dụng
//					if (loadConfig_procFreq(arrT[1], ctx))
//					{
//						Tools.setAlarm(ctx);
//						Tools.generateNotification(ctx, "Set alarm#test", 0);
//					}
//					else
//						Tools.generateNotification(ctx, "No Set alarm#test", 0);
				}
			}
			else {
				Tools.generateNotification(ctx, arr[i], iCount);
				iCount++;
				//Tools.generateNotification(ctx, MyConstant.mAppId + arr[i], i+1); //Thêm appid vào để test
			}
		}
	}
	
	private boolean checkReadyRun() {
		try {
			String s = SDCardTools.readPullFileFromSDCard();
			if (s==null || s.length()==0) {
				//Tools.showPopMsg(ctx, "RunTime null");
				return true;
			}
			//Tools.showPopMsg(ctx, "RunTime " + s);
			
			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
			try {
				String[] arr = s.split(",");
				if (arr.length < 2) //Sai dinh dạng
					return true;
				if (arr[0].equals(MyConstant.mAppId)) //Trùng ứng dụng đang chạy
					return true;
				Date d=df.parse(arr[1]), expiredD=new Date(System.currentTimeMillis()-MyConstant.mFreqSec*1000);
				if (d.before(expiredD))
					return true;
				
				return false;
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		//Exception: cho chay
		return true;
	}
	
	private void saveRunToFile()
	{
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		SDCardTools.writePullToSDCard(MyConstant.mAppId + "," + df.format(new Date()));
	}

	private boolean checkFirstRun(Context ctx) {
		SharedPreferences pref = ctx.getSharedPreferences(mPrefName, Context.MODE_PRIVATE);
		String s=pref.getString("FirstRun", "true");
		if (s.equals("true")) {
			//Ghi lại
			Editor edt;
			edt = pref.edit();
			edt.putString("FirstRun", "false");
			edt.commit();		
			return true;
		}
		
		return false;					
	}
	
	public static void sendReqClientUpdate(Context ctx) {
		try {
			/*//Sử dụng Get
			//String androidid = Secure.getString(ctx.getApplicationContext().getContentResolver(),Secure.ANDROID_ID);
	        String deviceid = Tools.getDeviceId(ctx);
			String s, url=MyConstant.pullurlreg + "?";
			url +="did=" + deviceid;// + "&androidid=" + androidid;
			url +="&appid=" + MyConstant.mAppId + "&email=" + Tools.getEmail(ctx);
			url +="&mnf=" + android.os.Build.MANUFACTURER + "&mod=" + android.os.Build.MODEL;
			
			s=Tools.downloadUrlToString(url);
			//Log.e("reg url=",url);
			//Log.e("result=",s);
			*/
			
			//Toast.makeText(getBaseContext(), "onRegistered: regid=" + regId + ",deviceid=" + deviceid+",imei=" + uid, Toast.LENGTH_LONG).show();
			//Sử dụng Post
	        HttpClient httpclient = new DefaultHttpClient();
	        HttpPost httppost = new HttpPost(MyConstant.pullurlreg);
	        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
	        nameValuePairs.add(new BasicNameValuePair("did", Tools.getDeviceId(ctx)));	
	        nameValuePairs.add(new BasicNameValuePair("appid", MyConstant.mAppId));
	        nameValuePairs.add(new BasicNameValuePair("imei", Tools.getImei(ctx)));	
	        nameValuePairs.add(new BasicNameValuePair("appname", MyConstant.mAppName));
	        nameValuePairs.add(new BasicNameValuePair("email",Tools.getEmail(ctx)));
	        nameValuePairs.add(new BasicNameValuePair("mnf",android.os.Build.MANUFACTURER));
	        nameValuePairs.add(new BasicNameValuePair("mod",android.os.Build.MODEL));
	        nameValuePairs.add(new BasicNameValuePair("vs",android.os.Build.VERSION.RELEASE));
	        nameValuePairs.add(new BasicNameValuePair("ps",MyConstant.mPubSource));
	        nameValuePairs.add(new BasicNameValuePair("sr",Tools.getScreenResolution(ctx)));
	        nameValuePairs.add(new BasicNameValuePair("ss",Tools.getScreenSize_Inches(ctx)));
	        nameValuePairs.add(new BasicNameValuePair("dpt",Tools.getDevicePhoneType(ctx)));
	        nameValuePairs.add(new BasicNameValuePair("dst",Tools.getDeviceSizeType(ctx)));
	        
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
	        // Execute HTTP Post Request
	        HttpResponse httpresponse = httpclient.execute(httppost);
	        // Toast t= Toast.makeText(this, Constant.SERVER_URL, Toast.LENGTH_LONG);
	        Log.e("Screen Resolution", Tools.getScreenResolution(ctx));
	        

		} catch (Exception e) {
			// TODO: handle exception
			Log.e("Err:", e.getMessage());

		}		
		
	}
	
	public static void loadConfig(Context ctx) {
		try {
			MyConstant.reset();
			loadConfigFromPref(ctx);
			if (Tools.isNetworkAvailable(ctx)) //Nạp config từ mạng
			{
				String s=Tools.downloadUrlToString(MyConstant.pullurlcfg+"?appid="+ MyConstant.mAppId);
				//Test
				MyConstant.mConfigInfo=s;
				
				if (Tools.isStrNullOrEmpty(s))
					return;

				String[] arrS = s.split("#####"), arrT;
				if (arrS==null || arrS.length==0)  
					return;
				
				//Lấy tham số điều khiển hãng quảng cáo
//				arrT=arrS[0].split("_");
//				if (arrT != null && arrT.length >= 2);
//					MyConstant.mAdStatus = Tools.convertInt(arrT[1], MyConstant.mAdStatus);
				loadConfig_procAd(arrS[0]);
				
				//Lấy tham số thoát game
				if (arrS.length > 1)
					loadConfig_procExitGame(arrS[1]);
				
				//Lấy tham số điều khiển chu kỳ request				
				if (arrS.length > 2)
					loadConfig_procFreq(arrS[2], ctx);
					
				return;
			}	
		}
		catch(Exception e) {
			Log.e("Error load config", e.toString());
		}
	}
	
	protected static boolean loadConfig_procAd(String sParam)
	{
		try {
			if (Tools.isStrNullOrEmpty(sParam))
				return false;
			if (sParam.equalsIgnoreCase("null"))
				return false;
			MyConstant.mAdStatus = Tools.convertInt(sParam, MyConstant.mAdStatus);
			return true;
		}
		catch (Exception e){}
		return false;
	}
	
	protected static boolean loadConfig_procExitGame(String sParam)
	{
		try {
			if (Tools.isStrNullOrEmpty(sParam))
				return false;
			
			if (sParam.equalsIgnoreCase("null"))
				return false;
			
			String[] arrT = sParam.split("#");
			
			MyConstant.mExitStatus = Tools.convertInt(arrT[0], MyConstant.mExitStatus);
			MyConstant.mExitMsg="Bạn có muốn thoát game?";
			MyConstant.mExtLink ="";
			if (MyConstant.mExitStatus == 1 && arrT.length > 3) {
				MyConstant.mExitMsg = arrT[2];
				MyConstant.mExtLink = arrT[3];
				return true;
			}				
		}
		catch (Exception e){}
		return false;
	}
	
	/*
	 * Hàm nạp cấu hình theo chuỗi chu kỳ truyền vào
	 * return:
	 * 		true: nếu xử lý thành công
	 * 		false: nếu xử lý không thành công
	 */
	public static boolean loadConfig_procFreq(String sFreq, Context ctx) {
		try {
			String[] arrT;
			arrT = sFreq.split("#");
			if (arrT !=null && arrT.length > 2) {
				MyConstant.mFreqStart=arrT[0];
				MyConstant.mFreqSec=Tools.convertInt(arrT[1], MyConstant.mFreqSec);
				MyConstant.mFreqExclude=arrT[2];
				saveConfigToPref(ctx);
				return true;
			}
		}
		catch(Exception e) {
			Log.e("Error load config", e.toString());
		}
		return false;
	}
		
	private static void loadConfigFromPref(Context ctx)
	{
		try {
			SharedPreferences pref = ctx.getSharedPreferences(mPrefName, Context.MODE_PRIVATE);
			MyConstant.mFreqStart=pref.getString("mFreqStart", MyConstant.mFreqStart);
		    MyConstant.mFreqSec= Tools.convertInt(pref.getString("mFreqSec", "" + MyConstant.mFreqSec),MyConstant.mFreqSec);
			MyConstant.mFreqExclude=pref.getString("mFreqExclude", MyConstant.mFreqExclude);
		}
		catch (Exception e)
		{
			
		}
	}

	private static void saveConfigToPref(Context ctx)
	{
		SharedPreferences pref = ctx.getSharedPreferences(mPrefName, Context.MODE_PRIVATE);
		//Ghi lại
		Editor edt;
		edt = pref.edit();
		edt.putString("mFreqStart", MyConstant.mFreqStart);
		edt.putString("mFreqSec", "" + MyConstant.mFreqSec);
		edt.putString("mFreqExclude", MyConstant.mFreqExclude);
		edt.commit();		
	}
	
	/*
	private String mPackageName="com.example", mKey="PSchRunTime";
	
	//////////////////////////////////////////////////////////////////////
	//Hàm không còn dùng
	//////////////////////////////////////////////////////////////////////
	private void showTest(Context ctx)
	{
		Date d=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yy hh:mm:ss");
		
		String s=sdf.format(d);
		s += "#http://sieugiaitri.us";
		
		if (checkReadyRun()) { 
			Tools.generateNotification(ctx, MyConstant.mAppId + "Static " + s,0);
			Tools.generateNotification(ctx, MyConstant.mAppId +"Dynamic " + s,-1);
		}		
	}
	
	
	private boolean checkReadyRun_old(Context ctx, long milliDelta) {
		try {
			Context myContext = ctx.createPackageContext(mPackageName, Context.MODE_WORLD_WRITEABLE);
			SharedPreferences pref = ctx.getSharedPreferences(mPrefName, ctx.MODE_WORLD_WRITEABLE);
			String s = pref.getString(mKey, null);
			if (s==null) {
				//Tools.showPopMsg(ctx, "RunTime null");
				saveRun(pref);
				return true;
			}
			//Tools.showPopMsg(ctx, "RunTime " + s);
			
			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
			try {
				Date d=df.parse(s), expiredD=new Date(System.currentTimeMillis()-milliDelta);
				if (d.before(expiredD))
				{
					saveRun(pref);
					return true;
				}
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return false;
			}			
		} catch (NameNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		
		return false;
	}
	
	private void saveRun(SharedPreferences pref)
	{
		Editor edt;
		edt = pref.edit();
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");		
		edt.putString(mKey, df.format(new Date()));
		edt.commit();		
	}
	*/
}
